/*
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package eu.fastl.dragster.log.config;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

import eu.fastl.dragster.util.PoiUtils;

public class SheetConfig {

    @XmlAttribute(name = "name", required = true)
    private String name;

    @XmlElementWrapper(name = "exclusions")
    @XmlElement(name = "exclusion")
    private final List<ExclusionConfig> exclusions = new ArrayList<ExclusionConfig>();

    @XmlElementWrapper(name = "columns")
    @XmlElement(name = "column")
    private final List<ColumnConfig> columns = new ArrayList<ColumnConfig>();

    public String getName() {
        return this.name;
    }

    public List<ExclusionConfig> getExclusions() {
        return this.exclusions;
    }

    public List<ColumnConfig> getColumns() {
        return this.columns;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

    public String getFormulaAsString(ColumnConfig columnConfig, int rowNum) {
        StringBuilder retval = new StringBuilder();
        for (ColumnElementConfig elementConfig : columnConfig.getElements()) {
            if ("EXECUTION_TYPE".equals(elementConfig.getType())) {
                retval.append(getColumnNameForExecutionType(elementConfig.getValue()));
                retval.append(rowNum);
            } else if ("EXPRESSION".equals(elementConfig.getType())) {
                retval.append(elementConfig.getValue());
            } else {
                throw new IllegalArgumentException("Unknown Column Element Type:" + elementConfig);
            }
        }
        return retval.toString();
    }

    private String getColumnNameForExecutionType(String value) {
        for (ColumnConfig columnConfig : this.columns) {
            if ("EXECUTION".equals(columnConfig.getType())) {
                if (columnConfig.getContainedExecutionType().equals(value)) {
                    int index = this.columns.indexOf(columnConfig);
                    return PoiUtils.getColumnName(index);
                }
            }
        }
        throw new IllegalArgumentException("Column Name " + value + " not present in sheet config: " + toString());
    }
}
